البرمجة

بناء تطبيق جهات الاتصال بـ Xamarin

بناء تطبيق جهات الاتصال باستخدام Xamarin – الجزء الأوّل

تُعتبر تطبيقات جهات الاتصال من التطبيقات الأساسية التي تستخدم بشكل يومي على مختلف أجهزة الهواتف الذكية، إذ تمثل هذه التطبيقات الوسيلة الأولى لتنظيم وإدارة بيانات الأشخاص والتواصل معهم بسهولة وسرعة. مع انتشار استخدام الهواتف المحمولة الذكية بأنظمة تشغيل متعددة، برزت الحاجة إلى تطوير تطبيقات تعمل عبر منصات متعددة بنفس الكفاءة. في هذا السياق، يأتي إطار العمل Xamarin كأحد أبرز الحلول التي تسمح بإنشاء تطبيقات متعددة المنصات (Cross-Platform) باستخدام لغة #C، وبمشاركة كبيرة في قاعدة الشيفرة المصدرية، مع الحفاظ على الأداء القريب من التطبيقات الأصلية (Native).

ما هو Xamarin ولماذا نستخدمه لبناء تطبيق جهات الاتصال؟

Xamarin هو إطار عمل تابع لمايكروسوفت يمكن المطورين من كتابة تطبيقات لأجهزة iOS وAndroid وWindows باستخدام لغة برمجة واحدة هي C#. يسمح Xamarin باستخدام مكتبات .NET القوية، مع إمكانيات الوصول إلى API الأصلية لكل نظام تشغيل. من أبرز ميزات Xamarin:

  • مشاركة نسبة كبيرة من الكود بين المنصات.

  • الأداء عالي لأن التطبيق يتم ترجمته إلى كود أصلي.

  • إمكانية استخدام مكتبات وأدوات .NET.

  • بيئة تطوير متكاملة مع Visual Studio.

عند بناء تطبيق لجهات الاتصال، يتطلب الأمر التعامل مع بيانات مخزنة محلياً أو عبر مزامنة مع خدمات سحابية، إلى جانب تمكين الوصول إلى أذونات نظام التشغيل لقراءة وكتابة جهات الاتصال.

مكونات تطبيق جهات الاتصال في Xamarin

قبل الشروع في كتابة الكود، من المهم فهم المكونات الرئيسية التي يشملها تطبيق جهات الاتصال:

  1. واجهة المستخدم (UI): تشمل شاشات عرض قائمة جهات الاتصال، شاشة إضافة جهة اتصال جديدة، شاشة تفاصيل جهة الاتصال، وشاشة تحرير البيانات.

  2. نموذج البيانات (Data Model): هيكلة بيانات جهة الاتصال والتي تشمل الاسم، رقم الهاتف، البريد الإلكتروني، العنوان، الصورة الشخصية، وغيرها.

  3. الوصول إلى البيانات (Data Access): حفظ واسترجاع بيانات جهات الاتصال. يمكن أن يكون عبر قاعدة بيانات محلية مثل SQLite أو عبر الوصول إلى جهات الاتصال الأصلية للنظام.

  4. الأذونات (Permissions): طلب الأذونات اللازمة من نظام التشغيل للسماح بالوصول إلى جهات الاتصال، خاصة في أنظمة iOS وAndroid التي تتطلب سياسة أمان صارمة.

  5. الوظائف الأساسية (Core Logic): كوظائف إضافة، تعديل، حذف، والبحث داخل قائمة جهات الاتصال.

إعداد بيئة العمل لإنشاء تطبيق جهات الاتصال

لبدء تطوير التطبيق باستخدام Xamarin، يجب تجهيز البيئة التالية:

  • Visual Studio: يُفضل استخدام Visual Studio 2022 أو أحدث، مع تثبيت مكون Xamarin.

  • أجهزة محاكاة (Simulators/Emulators): لمحاكاة نظام iOS (على ماك أو باستخدام خدمات معينة) وAndroid.

  • حسابات مطورين: على متجر Google Play وApple App Store لاختبار أذونات التطبيق عملياً.

بعد تثبيت الأدوات والتأكد من عمل البيئة، يمكن البدء في إنشاء مشروع جديد من نوع Xamarin.Forms، الذي يسمح بتطوير تطبيق يعمل عبر جميع المنصات باستخدام واجهة مستخدم مشتركة.

إنشاء نموذج بيانات جهة الاتصال (Contact Model)

أول خطوة برمجية هي إنشاء كلاس يعبر عن بيانات جهة الاتصال. يتطلب النموذج أن يكون قابلاً للتوسيع والتعديل، مع دعم لخصائص مهمة تشمل:

csharp
public class Contact { public int Id { get; set; } public string FullName { get; set; } public string PhoneNumber { get; set; } public string Email { get; set; } public string Address { get; set; } public string PhotoPath { get; set; } }

تمثل خاصية Id مفتاحًا فريدًا لتمييز كل جهة اتصال، أما بقية الخصائص فهي معلومات مهمة يتم عرضها وتخزينها.

تصميم واجهة المستخدم الأساسية

في مشروع Xamarin.Forms، يتم تصميم واجهات المستخدم عبر ملفات XAML التي تتيح فصل التصميم عن المنطق البرمجي. لتصميم شاشة قائمة جهات الاتصال، يمكن إنشاء ملف XAML يحتوي على عناصر مثل:

  • ListView أو CollectionView لعرض قائمة جهات الاتصال.

  • ToolbarItem أو زر لإضافة جهة اتصال جديدة.

  • عناصر بحث لتصفية قائمة الأسماء.

مثال على تصميم شاشة القائمة:

xml
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="ContactsApp.MainPage" Title="جهات الاتصال"> <StackLayout> <SearchBar x:Name="searchBar" Placeholder="ابحث عن جهة اتصال" TextChanged="OnSearchTextChanged"/> <ListView x:Name="contactsListView" ItemSelected="OnContactSelected"> <ListView.ItemTemplate> <DataTemplate> <TextCell Text="{Binding FullName}" Detail="{Binding PhoneNumber}" /> DataTemplate> ListView.ItemTemplate> ListView> StackLayout> ContentPage>

في هذا التصميم، يتم إدراج مربع بحث لتصفية جهات الاتصال، مع قائمة تعرض الاسم ورقم الهاتف.

بناء منطق التطبيق لإدارة جهات الاتصال

يتطلب تطبيق جهات الاتصال إدارة الحالة داخلياً، بما في ذلك تحميل البيانات، البحث، التصفية، والتنقل بين الشاشات. تبدأ العملية بإنشاء ViewModel يرتبط بواجهة المستخدم ويتحكم في البيانات، حسب نمط MVVM (Model-View-ViewModel) الشائع في Xamarin.Forms.

تحميل قائمة جهات الاتصال

في البداية، يتم تحميل بيانات جهات الاتصال إما من قاعدة بيانات محلية أو من خدمة. لتبسيط البداية، يمكن استخدام قائمة ثابتة كمثال:

csharp
public class ContactsViewModel : INotifyPropertyChanged { public ObservableCollection Contacts { get; set; } private ObservableCollection allContacts; public ContactsViewModel() { // بيانات تجريبية allContacts = new ObservableCollection { new Contact { Id=1, FullName="أحمد محمد", PhoneNumber="0123456789", Email="[email protected]" }, new Contact { Id=2, FullName="سارة علي", PhoneNumber="0987654321", Email="[email protected]" }, // المزيد من جهات الاتصال }; Contacts = new ObservableCollection(allContacts); } public void SearchContacts(string query) { if (string.IsNullOrWhiteSpace(query)) { Contacts = new ObservableCollection(allContacts); } else { var filtered = allContacts.Where(c => c.FullName.Contains(query, StringComparison.OrdinalIgnoreCase)); Contacts = new ObservableCollection(filtered); } OnPropertyChanged(nameof(Contacts)); } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }

هذا الكود يتيح تحميل قائمة أولية من جهات الاتصال مع خاصية البحث والتصفية.

ربط ViewModel بواجهة المستخدم

في صفحة XAML، يتم ربط ViewModel بواجهة المستخدم ليتم تحديث القائمة تلقائياً عند تغيير البيانات:

csharp
public partial class MainPage : ContentPage { ContactsViewModel viewModel; public MainPage() { InitializeComponent(); viewModel = new ContactsViewModel(); BindingContext = viewModel; contactsListView.ItemsSource = viewModel.Contacts; } private void OnSearchTextChanged(object sender, TextChangedEventArgs e) { viewModel.SearchContacts(e.NewTextValue); contactsListView.ItemsSource = viewModel.Contacts; } private async void OnContactSelected(object sender, SelectedItemChangedEventArgs e) { if (e.SelectedItem == null) return; var contact = e.SelectedItem as Contact; await Navigation.PushAsync(new ContactDetailPage(contact)); contactsListView.SelectedItem = null; } }

هذا الربط يحقق تفاعلاً سلساً بين المستخدم وقائمة جهات الاتصال، مع إمكانية التصفية والعرض التفصيلي.

التعامل مع الأذونات والوصول إلى جهات الاتصال الأصلية

تعتبر نقطة مهمة في تطبيق جهات الاتصال هي القدرة على قراءة وكتابة بيانات جهات الاتصال من النظام نفسه، لا فقط البيانات المحلية للتطبيق. للحصول على هذا، يتوجب طلب أذونات من المستخدم، حيث تختلف السياسات بين أنظمة التشغيل.

نظام Android

في Android، يجب طلب أذونات في ملف AndroidManifest.xml وكذلك برمجياً وقت التشغيل لأن الأندرويد الحديث يفرض طلب الأذونات أثناء استخدام التطبيق.

الأذونات المهمة:

xml
<uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_CONTACTS" />

وبعدها، في الكود البرمجي، يتم طلب الأذونات عبر مكتبة Permissions Plugin أو عبر API الأصلي.

نظام iOS

في iOS، يتم إضافة مفتاح في ملف Info.plist لتعريف سبب طلب الأذونات:

xml
<key>NSContactsUsageDescriptionkey> <string>التطبيق يحتاج إلى الوصول إلى جهات الاتصال لإدارة بياناتكstring>

وبعد ذلك يطلب النظام من المستخدم منح الإذن عند أول محاولة للوصول.

استخدام مكتبة Xamarin.Essentials لإدارة الأذونات

تقدم مكتبة Xamarin.Essentials طريقة موحدة للتعامل مع الأذونات عبر الأنظمة:

csharp
var status = await Permissions.RequestAsync(); if (status == PermissionStatus.Granted) { // يمكن الوصول إلى جهات الاتصال } else { // التعامل مع الرفض }

قراءة جهات الاتصال من النظام

لا توفر Xamarin.Forms API موحدة مباشرة للوصول إلى جهات الاتصال الأصلية، لذلك يعتمد المطور على مكتبات خارجية مثل:

  • Plugin.ContactService

  • Plugin.Contacts

أو يمكن كتابة كود خاص لكل نظام باستخدام DependencyService لعمل واجهة للوصول إلى جهات الاتصال.

مثال على استخدام DependencyService

يتم تعريف واجهة في المشروع المشترك:

csharp
public interface IContactService { Task> GetContactsAsync(); }

ثم في مشروع Android، يتم تنفيذ هذه الواجهة باستخدام API الخاص بقراءة جهات الاتصال، ونفس الشيء في iOS.

بهذه الطريقة، يمكن استدعاء الكود المشترك للحصول على قائمة جهات الاتصال من النظام.

إدارة بيانات جهات الاتصال (إضافة، تعديل، حذف)

عند بناء تطبيق كامل، يجب توفير إمكانية إضافة جهات اتصال جديدة، تعديل جهات اتصال موجودة، وحذفها. هذه العمليات تعتمد على نظام التشغيل:

  • في Android، يمكن استخدام ContentProvider الخاص بجهات الاتصال.

  • في iOS، يمكن استخدام Contacts Framework.

في حال كان التطبيق يدير جهات الاتصال الخاصة به فقط، يمكن الاعتماد على قاعدة بيانات محلية مثل SQLite.

تخزين البيانات محلياً باستخدام SQLite

لتحقيق أداء عالي وإمكانية العمل دون اتصال، يمكن تخزين جهات الاتصال محلياً باستخدام SQLite، وهو نظام قاعدة بيانات مدمج مع دعم جيد في Xamarin.

إعداد SQLite

  • تثبيت حزمة NuGet sqlite-net-pcl

  • إنشاء قاعدة بيانات في مجلد التطبيق

  • كتابة كود لإنشاء الجدول وإجراء عمليات CRUD (إضافة، قراءة، تحديث، حذف)

مثال على إعداد قاعدة البيانات

csharp
public class ContactsDatabase { private readonly SQLiteAsyncConnection database; public ContactsDatabase(string dbPath) { database = new SQLiteAsyncConnection(dbPath); database.CreateTableAsync().Wait(); } public Task<List<Contact>> GetContactsAsync() { return database.Table().ToListAsync(); } public Task<int> SaveContactAsync(Contact contact) { if (contact.Id != 0) return database.UpdateAsync(contact); else return database.InsertAsync(contact); } public Task<int> DeleteContactAsync(Contact contact) { return database.DeleteAsync(contact); } }

يضمن هذا الأسلوب تنظيم البيانات واسترجاعها بكفاءة.

الخلاصة

إن بناء تطبيق جهات الاتصال باستخدام Xamarin يتيح تطوير تطبيق متكامل عبر مختلف منصات الهواتف الذكية باستخدام كود مشترك ومتكامل. يبدأ المشروع بفهم متطلبات التطبيق من حيث تصميم نموذج البيانات، واجهة المستخدم، إدارة البيانات، وتلبية متطلبات الأمان والأذونات الخاصة بأنظمة التشغيل.

يشكل تطبيق جهات الاتصال مثالاً عملياً على كيفية استخدام Xamarin.Forms لتطوير تطبيقات حقيقية، مع التركيز على تجربة المستخدم، الأداء، والمرونة في الصيانة والتطوير المستقبلي. المرحلة القادمة تشمل تفصيل كيفية تنفيذ عمليات الإضافة والتعديل، التعامل مع الصور الشخصية، واستعمال خدمات السحابة لمزامنة البيانات بين الأجهزة، وهو ما سيتم التطرق إليه في الجزء الثاني من المقال.


المصادر والمراجع